/*********************************************************************
* File: INavigation.h
*
* Supports basic agent navigation.
*********************************************************************/
#pragma once

#include "ICollisionHandler.h"

namespace agents{namespace interfaces{
	/**
	* \class INavigation
	* \brief Supports basic agent navigation.
	*
	* Basic control for agent navigation. Defines actuators for moving and rotating.
	*
	* \author Instituto Superior Tecnico de Lisboa, Portugal
	* \author Technical University of Lisbon, Portugal
	* 
	* \author Agentes Autonomos e Sistemas Multiagente
	* \author Autonomous Agents and Multiagent Systems
	* 
	* \version	1.0
	* \date		2006/2007
	**/
	class INavigation: public ICollisionHandler
	{
	public:
		/**
		* \brief Gets the agent's position.
		*
		* Gets the agent's position in three-dimensional coordinates. 
		*
		* \return The agent's position.
		**/
		virtual Vector getPosition() = 0;
		/**
		* \brief Gets the agent's moving angles.
		*
		* The moving angles define the forward moving vector. Notice, the moving angles 
		* are different from the aiming angles. 
		*
		* \return The agent's moving angles.
		**/
		virtual Vector getAngles() = 0;

		/**
		* \brief The move forward actuator.
		*
		* Makes the agent move in the forward direction. Notice, the actuator must be
		* invoked at every cycle for continuous motion
		**/
		virtual void moveForward() = 0;
		/**
		* \brief The move backwards actuator.
		*
		* Makes the agent move in the backwards direction. Notice, the actuator must be
		* invoked at every cycle for continuous motion
		**/
		virtual void moveBackwards() = 0;
		/**
		* \brief The move to the left actuator.
		*
		* Makes the agent move towards the left. Notice, the actuator must be
		* invoked at every cycle for continuous motion
		**/
		virtual void moveLeft() = 0;
		/**
		* \brief The move to the right actuator.
		*
		* Makes the agent move towards the right. Notice, the actuator must be
		* invoked at every cycle for continuous motion. 
		**/
		virtual void moveRight() = 0;
		/**
		* \brief The rotate to the left actuator.
		*
		* Makes the agent rotate towards the left. Notice, the actuator must be
		* invoked at every cycle for continuous rotation.
		* Does not affect the aiming angles (see agents::interfaces::ICombat).
		**/
		virtual void rotateLeft() = 0;
		/**
		* \brief The rotate to the right actuator.
		*
		* Makes the agent rotate towards the right. Notice, the actuator must be
		* invoked at every cycle for continuous rotation
		* Does not affect the aiming angles (see agents::interfaces::ICombat).
		**/
		virtual void rotateRight() = 0;

		/**
		* \brief The jump actuator.
		**/
		virtual void jump() = 0;
		/**
		* \brief The duck actuator.
		**/
		virtual void duck() = 0;
		
		/**
		* \brief Gets the agent's forward/backwards speed.
		* 
		* The speed lies in the range [0.0;1.0]
		**/
		virtual float getFrontSpeed() = 0;
		/**
		* \brief Sets the agent's forward/backwards speed.
		* 
		* The speed must be in the range [0.0;1.0]
		**/
		virtual void setFrontSpeed(float frontSpeed) = 0;
		/**
		* \brief Gets the agent's left/right speed.
		* 
		* The speed lies in the range [0.0;1.0]
		**/
		virtual float getSideSpeed() = 0;
		/**
		* \brief Sets the agent's left/right speed.
		* 
		* The speed must be in the range [0.0;1.0]
		**/
		virtual void setSideSpeed(float sideSpeed) = 0;
		/**
		* \brief Gets the agent's rotation speed.
		* 
		* The speed lies in the range [0.0;1.0]
		**/
		virtual float getRotationSpeed() = 0;
		/**
		* \brief Sets the agent's rotation speed.
		* 
		* The speed must be in the range [0.0;1.0]
		**/
		virtual void setRotationSpeed(float rotationSpeed) = 0;
	};
}}
